//============================================================================
// Nome        : mapas.h
// Autores     : T1G7
//                                      Felipe Galvão do Espírito Santo
//                                      Ivanilda Maísa Costa Brazão de Almeida
//                                      Paulo Jorge de Faria dos Reis
// Versão      : 1.0
// Data        : Maio de 2011
// Copyright   : Creative Commons 2.0
// Descrição   : CAL 2011 - TG1
//               Tema 12 - Transporte de pacientes de uma clínica de saúde.
//============================================================================

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
#include "Auxiliar.h"
#include "Graph.h"

using namespace std;

//! Classe que define um ponto geográfico.
class no
{
public:
	no(string linha);			//! Recebe uma string contendo uma linha do ficheiro de nodes obtidos da adapta��o do OSM.
	~no();						//! Destrutor.
	bool operator== (no no1);	//! Operador igualdade necessário para a utilização do algoritmo Dijkstra.
	int getID();				//! Devolve o identificador de um nó do vector de pontos.
	float latitude();			//!
	float longitude();

private:
	//! Dados a guardar no n�
	int identificador;
	float posX;
	float posY;
	float projX;
	float projY;
};


//! Ruas de um mapa.
class morada
{
public:
	morada(string linha);					//! identificador da rua;nome da rua;rua de um sentido(true,false)
	~morada();
//	string oNome(int identificador);	//! Devolve o nome da rua a partir do identificador.

private:
	int identificador;
	string nome;
	bool umSentido;
};


//! Ponto de localiza��o geogr�fico.
class unidade
{
public:
	unidade(string ponto);		//! identificador da rua;identificador do n� origem;identificador do n� destino;
	~unidade();
	int noInicio();
	int noFinal();

private:
	int identificador;
	int inicio;
	int fim;
};


//! Mapa processado a partir dos ficheiros de texto.
class mapa
{
public:
	mapa(float esquerda, float direita, float cima, float baixo, int X, int Y);	//! Cria um mapa indicando as coordenadas minimas e maximas e a dimensão do mapa.
	~mapa();
	void processaMapa(char * fNodes, char * fRuas, char * fSubruas);		//! Depois de criar um mapa é necessário carregar o mesmo com a informação.
	vector<no>::iterator infoNo(int id);	//! Devolve um iterador para um nó a partir do identificador do nó geográfico.
	vector<no>::iterator primeiro();		//! Iterador para o primeiro elemento do vector de pontos.
	void planearRotas(vector<int>* rotas, vector<int>* avisitar, int lugares);	//! Criar uma rota mais curta.
	no& noPorID(int ident);		//! Devolve uma referência para um nó a partir do seu identificador.


private:
	int horizontal;					//! X
	int vertical;					//! Y
	float longitudeMin;				//! esquerda
	float longitudeMax;				//! direita
	float latitudeMin;				//! baixo
	float latitudeMax;				//! cima
	vector<no> pontos;				//! Colecção dos nós geográficos de um mapa.
	vector<morada> arruamentos;		//! Ruas do mapa.
	vector<unidade> pontosInteresse;//! Sub ruas, a localização mais pequena que se pode definir.
	Graph<no> grafoDoMapa2;			//! Este é o grafo para o DijKstra.
	Graph<int> grafoDoMapa;			//! Este é o grafo para o DijKstra.
};


